package java高并发程序设计.chapter1;

import java.util.concurrent.atomic.AtomicInteger;

public class LockFreeExample {
	//共享变量，用于记录访客数量
	AtomicInteger atomicInteger = new AtomicInteger(0);

	/*
	 * 记录访客数量(无锁实现)
	 * 1.获得当前访客数量
	 * 2.将当前访客数量加1
	 * 若当前访客数量不是预期值，则重新获得最新值
	 */
	public void logUserVisit(){
		int curUserNum = atomicInteger.get();
		while(!atomicInteger.compareAndSet(curUserNum, curUserNum+1)){
			curUserNum = atomicInteger.get();
		}
	}
	/*
	 * 总结：
	 * 1.无锁的实现必须保证至少有一个线程可以在有限步内完成
	 * 2.无锁一般需要一个无限循环来不断尝试修改
	 * 3.有可能出现饥饿现象，即一个线程每次尝试修改都失败
	 */
}
